nclude <stdio.h>
#include <sys/types.h>//open
#include <sys/stat.h>//open
#include <fcntl.h>//open
#include <unistd.h>//close
#include <sys/types.h>
#include <unistd.h>
#include <sys/mman.h>//mmap
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

typedef float SLTDataType;

typedef struct SListNode
{
	SLTDataType tem;
	SLTDataType hum;
	long long data;
	struct SListNode* next;
}SLTNode;

SLTNode* BuySListNode(SLTDataType x, SLTDataType y, long long z)//申请新的节点
{
	SLTNode* newnode = (SLTNode*)malloc(sizeof(SLTNode));
	if (newnode == NULL)
	{
		perror("malloc fail");
		exit(-1);
	}
	newnode->tem = x;
	newnode->hum = y;
	newnode->data = z;
	newnode->next = NULL;
}

void SLTPrint(SLTNode* phead)//打印全部节点
{
	SLTNode* cur = phead;
	while (cur)
	{
		printf("当前日期：%lld 当前温度：%.2f 当前湿度：%f ", cur->data, cur->tem, cur->hum);
		cur = cur->next;
		printf("\n");
	}

}


void SLTPushBack(SLTNode** pphead, SLTDataType x, SLTDataType y, long long z)//尾插
{
	SLTNode* newnode = BuySListNode(x, y, z);
	//pphead空指针，对地址进行操作
	if (!*pphead)
		*pphead = newnode;
	else//不为空，以下为对结构体进行操作
	{

		SLTNode* dit = *pphead;
		while (dit->next)
		{
			dit = dit->next;
		}
		dit->next = newnode;
	}
}

void input(SLTNode** pphead)
{
	printf("请输入要录入的数据：\n");
	printf("日期(格式：20231212)：");
	long long da = 0;
	scanf("%lld", &da);
	printf("温度:");
	float tm = 0;
	scanf("%f", &tm);
	printf("湿度:");
	float hu = 0;
	scanf("%f", &hu);
	SLTPushBack(pphead, tm, hu, da);

}

void SLTPopBack(SLTNode** pphead, SLTNode* pos)//尾删
{
	assert(pphead);

	SLTNode* cur = *pphead;
	SLTNode* prev = *pphead;
	while (cur != pos)
	{
		prev = cur;
		SLTNode* next = cur->next;
		cur = next;
	}
	if (cur == *pphead)
	{
		*pphead = cur->next;
		free(cur);
	}
	else
	{
		prev->next = cur->next;
		free(cur);
	}

}


SLTNode* SLTFind(SLTNode* phead, long long x)//查找
{
	//判空
	assert(phead);
	//遍历找值
	SLTNode* cur = phead;
	while (cur != NULL)
	{
		if (cur->data == x)
		{
			return cur;
		}
		cur = cur->next;
	}
	return NULL;
}

void Change(SLTNode* phead, long long x)
{
	SLTNode* cur = SLTFind(phead, x);
	if (cur)
	{
		SLTDataType tm;
		SLTDataType hu;
		printf("输入要修改的温度：");
		scanf("%f", &tm);
		printf("输入要修改的湿度：");
		scanf("%f", &hu);
		cur->hum = hu;
		cur->tem = tm;

	}
}


void SLTDestroy(SLTNode** pphead)
{
	assert(pphead);

	SLTNode* cur = *pphead;
	while (cur)
	{
		SLTNode* next = cur->next;
		free(cur);

		cur = next;
	}

	*pphead = NULL;
}

void Savefile(SLTNode* phead)
{
    int flag=O_RDWR|O_CREAT;
    int fd = -1;
    fd = open("1.txt",flag);
    if(-1==fd)
    {
        printf("打开%s文件失败\n", "1.txt");
        exit(2);
    }
    SLTNode* cur = phead;
	long long dt=0;
	float tm=0;
	float hu=0;
    while(cur)
    {   
        int ret=-1;

        dt=cur->data;
        ret = write(fd, &dt, sizeof(dt));
        tm=cur->tem;
        ret = write(fd, &tm, sizeof(tm));
        hu = cur->hum;
        ret = write(fd, &hu, sizeof(hu));
        if(-1 == ret)
        {
            printf("写入数据失败!\n");
        }
        cur=cur->next;
    }
    close(fd);
}

void menu()
{
	printf(" ———————————————————————————————\n");
	printf(" ———————智慧农业管理系统————————\n");
	printf(" ———1.插入数据     2.修改数据———\n ");
	printf("———3.显示数据     4.删除数据———\n ");
	printf("———5.删除所有数据  6.退出系统———\n");
	printf(" ———————————————————————————————\n");
}

void menu2()
{
	printf(" ———————————————————————————————\n");
	printf(" ———————智慧农业管理系统————————\n");
	printf(" ———  选择你的身份：    ————————\n ");
	printf("———  1.root      2.user  ——————\n ");
	printf("———  0.退出系统     ———————————\n");
	printf(" ———————————————————————————————\n");
}



void excute()
{
	SLTNode* plist = NULL;

	int flag = 1;
	while (flag)
	{
		menu();
		printf("请选择操作命令:");
		scanf("%d", &flag);
		switch (flag)
		{
		case 1://录入信息
		{
			input(&plist);
		}
		break;
		case 2://修改信息
		{
			printf("输入要修改的日期：");
			long long x = 0;
			scanf("%lld", &x);
			Change(plist, x);
		}
		break;
		case 3://显示信息
		{
			if (plist)
			{
				SLTPrint(plist);
			}
			else
			{
				printf("系统中无数据！\n");
			}

		}
		break;
		case 4://删除信息
		{
			printf("输入要删除的日期：");
			long long x = 0;
			scanf("%lld", &x);
			SLTNode* pos = SLTFind(plist, x);
			if (pos)
			{
				SLTPopBack(&plist, pos);
			}
			else
			{
				printf("无该日期数据！\n");
			}

		}
		break;
		case 5://删除所有数据
		{
			SLTDestroy(&plist);
			printf("已删除所有数据！\n");
		}
		break;
		case 6://退出系统
		{
            Savefile(plist);
			printf("退出系统成功！数据已保存至1.txt\n");
			flag = 0;
		}
		break;
		default:
		{
			printf("输入错误！请输入正确的指令！\n");
		}
		break;
		}

		if (flag != 3 && flag != 1 && flag != 0)
			system("cls");//清屏
	}

}


int main()
{
	//test();
	excute();
	//menu2();
	return 0;
}
